package com.cskaoyan.javase.object._6clone._1instanceof;

import javax.xml.transform.sax.SAXTransformerFactory;

/**
 * 空接口的作用
 * 首先类实现空接口,没有办法得到一个新成员,那么空接口的作用是什么呢?
 * 类实现空接口,改变了类的数据类型
 * --> 从原先不是空接口的子类,变成了空接口的子类
 * 那么变成了子类,又有什么关系呢?
 *
 * 引用 instanceof 类名/接口名
 * 用于判断引用指向的对象 是否是后面(普通)类名的子类或者子类对象
 * 如果是抽象类名/接口名,判断是不是子类对象
 *
 * 这时就可以针对不同的情况,做出不同的操作.
 *
 * 总结一下:
 *      空接口实际上起着标记的作用,也叫标记接口
 *      被空接口标记的类,配合instanceof就可以实现针对不同,做出不同的操作:
 *          如果实现了标记接口,就允许做xxx操作
 *          如果没有实现标记接口,就不允许做xxx操作,甚至抛出异常
 *
 *
 * @since 17:03
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) throws CloneNotSupportedException {
        judgeReference(new A());
        judgeReference(new B());
    }

    public static void judgeReference(Object o) throws CloneNotSupportedException {
        if (o instanceof Cloneable){
            // o是接口Cloneable的子类对象
            // 于是允许做一些操作,比如克隆
            System.out.println("允许做克隆操作!");
            return;
        }
        // o不是接口Cloneable的子类对象
        // 于是禁止做一些操作,比如克隆
        System.out.println("禁止做克隆操作!抛出异常!");
        throw new CloneNotSupportedException("不许做克隆操作!");
    }
}
class B{}
class A implements Cloneable{

}
interface Cloneable{

}
